package com.ruicar.afs.cloud.product.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruicar.afs.cloud.common.core.enums.AfsEnumUtil;
import com.ruicar.afs.cloud.product.condition.ProductAtomCondition;
import com.ruicar.afs.cloud.product.condition.ProductTemplateCondition;
import com.ruicar.afs.cloud.product.entity.ProductAtom;
import com.ruicar.afs.cloud.product.entity.ProductTemplate;
import com.ruicar.afs.cloud.product.entity.ProductTemplateAtom;
import com.ruicar.afs.cloud.product.enums.MoveTypeEnum;
import com.ruicar.afs.cloud.product.enums.StatusEnum;
import com.ruicar.afs.cloud.product.mapper.ProductTemplateAtomMapper;
import com.ruicar.afs.cloud.product.service.ProductAtomService;
import com.ruicar.afs.cloud.product.service.ProductTemplateAtomService;
import com.ruicar.afs.cloud.product.service.ProductTemplateService;
import com.ruicar.afs.cloud.product.vo.ProductTemplateAtomVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author changyu.gui
 * @version 1.0
 * @describe 产品模块原子表信息
 * @date 2020/4/27 17:26
 */
@Service
public class ProductTemplateAtomServiceImpl extends ServiceImpl<ProductTemplateAtomMapper, ProductTemplateAtom> implements ProductTemplateAtomService {
    @Autowired
    private ProductAtomService productAtomService;
    @Autowired
    private ProductTemplateService productTemplateService;
    @Autowired
    private ProductTemplateAtomService productTemplateAtomService;

    public IPage<List<ProductTemplateAtomVo>> getProductTemplateAtomVoList(Page page, Long productTemplateId) {
        return baseMapper.getProductTemplateAtomVoList(page, productTemplateId);
    }

    /**
     * 保存默认原子
     *
     * @param productAtomCondition
     */
    public void saveProductTemplateAtomDefault(ProductAtomCondition productAtomCondition) {
        int atomSerialNumber = productAtomCondition.getAtomSerialNumber();
        List<ProductTemplateAtom> list = new ArrayList<>();
        List<ProductAtom> listAtom = new ArrayList<>();
        for (ProductAtom productAtom : productAtomService.getListProductAtom(productAtomCondition)) {

            productAtom.setAtomIsReference(AfsEnumUtil.key(StatusEnum.YES));
            listAtom.add(productAtom);

            ProductTemplateAtom productTemplateAtom = new ProductTemplateAtom(productAtomCondition.getProductTemplateId(), Long.valueOf(productAtom.getId()), AfsEnumUtil.key(StatusEnum.YES), atomSerialNumber);
            list.add(productTemplateAtom);
            atomSerialNumber++;
        }
        if (list.size() > 0) this.saveBatch(list);
        if (listAtom.size() > 0) productAtomService.updateBatchById(listAtom);
    }

    public ProductTemplate saveTemplateInfo(ProductTemplate productTemplate) {
        ProductTemplate template = productTemplateService.getOne(Wrappers.<ProductTemplate>query()
                .lambda().eq(ProductTemplate::getTemplateNumber, productTemplate.getTemplateNumber())
                .orderByDesc(ProductTemplate::getVersionNumber), false
        );
        productTemplate.setVersionNumber(template.getVersionNumber() + 1);
        Long id = Long.valueOf(productTemplate.getId());
        productTemplate.setId(null);
        productTemplate.setCreateBy(null);
        productTemplate.setCreateTime(null);
        productTemplate.setUpdateBy(null);
        productTemplate.setUpdateTime(null);
        productTemplate.setIsEffective(AfsEnumUtil.key(StatusEnum.NO));
        productTemplate.setTemplateIsReference(AfsEnumUtil.key(StatusEnum.NO));
        productTemplateService.save(productTemplate);
        List<ProductTemplateAtom> list = new ArrayList<>();
        this.list(Wrappers.<ProductTemplateAtom>query().lambda()
                .eq(ProductTemplateAtom::getProductTemplateId, id))
                .forEach(productTemplateAtom -> {
                    productTemplateAtom.setId(null);
                    productTemplateAtom.setProductTemplateId(Long.valueOf(productTemplate.getId()));
                    list.add(productTemplateAtom);
                });
        if (list.size() > 0) this.saveBatch(list);
        return productTemplate;
    }

    //删除对应的原子饼排序
    public void removeAll(Long id, List productAtomIdList) {
        //删除对应的原子
        productTemplateAtomService.remove(Wrappers.<ProductTemplateAtom>query().lambda()
                .eq(ProductTemplateAtom::getProductTemplateId, id)
                .in(ProductTemplateAtom::getProductAtomId, productAtomIdList)
        );
        //剩下的原子进行重新排序
        this.sequenceOrderById(id);
    }

    //模板原子移动
    public void moveTemplateAll(ProductTemplateCondition productTemplateCondition) {

        Long productTemplateId = productTemplateCondition.getId();
        //得到限值
        List<ProductTemplateAtom> listAtom = productTemplateAtomService.list(Wrappers.<ProductTemplateAtom>query().lambda()
                .eq(ProductTemplateAtom::getProductTemplateId, productTemplateId)
                .orderByAsc(ProductTemplateAtom::getAtomSerialNumber)
        );
        int limitValue = listAtom.size();
        //修改的值
        List<ProductTemplateAtom> listResult = new ArrayList<>();
        //修改排序值
        Long[] ids = productTemplateCondition.getIds();
        for (int i = 0; i < ids.length; i++) {
            ProductTemplateAtom productTemplateAtom = productTemplateAtomService.getById(ids[i]);

            int replaceNum = productTemplateAtom.getAtomSerialNumber();

            if (AfsEnumUtil.key(MoveTypeEnum.MOVE_UP).equals(productTemplateCondition.getMoveType())) {
                if (replaceNum > 0) {//第一条不上移
                    listAtom.add(replaceNum - 1, listAtom.get(replaceNum));
                    listAtom.add(replaceNum + 1, listAtom.get(replaceNum));
                    listAtom.remove(replaceNum);
                    listAtom.remove(replaceNum + 1);
                }
            } else if (AfsEnumUtil.key(MoveTypeEnum.MOVE_DOWN).equals(productTemplateCondition.getMoveType())) {
                if (replaceNum < limitValue - 1) {//最后一条不下移
                    listAtom.add(replaceNum, listAtom.get(replaceNum + 1));
                    listAtom.add(replaceNum + 2, listAtom.get(replaceNum + 1));
                    listAtom.remove(replaceNum + 1);
                    listAtom.remove(replaceNum + 2);
                }
            } else if (AfsEnumUtil.key(MoveTypeEnum.MOVE_TOP).equals(productTemplateCondition.getMoveType())) {
                productTemplateAtom.setAtomSerialNumber(productTemplateAtom.getAtomSerialNumber() - limitValue);
            } else if (AfsEnumUtil.key(MoveTypeEnum.MOVEA_END).equals(productTemplateCondition.getMoveType())) {
                productTemplateAtom.setAtomSerialNumber(productTemplateAtom.getAtomSerialNumber() + limitValue);
            }
            listResult.add(productTemplateAtom);
        }
        if (AfsEnumUtil.key(MoveTypeEnum.MOVE_UP).equals(productTemplateCondition.getMoveType()) || AfsEnumUtil.key(MoveTypeEnum.MOVE_DOWN).equals(productTemplateCondition.getMoveType())) {
            this.sequenceOrder(listAtom, listResult);
        }
        if (AfsEnumUtil.key(MoveTypeEnum.MOVE_TOP).equals(productTemplateCondition.getMoveType()) || AfsEnumUtil.key(MoveTypeEnum.MOVEA_END).equals(productTemplateCondition.getMoveType())) {
            //修改移动的排序值
            productTemplateAtomService.updateBatchById(listResult);
            //原子进行重新排序
            this.sequenceOrderById(productTemplateId);
        }

    }

    //原子进行重新排序
    public void sequenceOrderById(Long id) {
        List<ProductTemplateAtom> listResult = new ArrayList<>();
        List<ProductTemplateAtom> listAtom = productTemplateAtomService.list(Wrappers.<ProductTemplateAtom>query().lambda()
                .eq(ProductTemplateAtom::getProductTemplateId, id)
                .orderByAsc(ProductTemplateAtom::getAtomSerialNumber, ProductTemplateAtom::getUpdateTime)
        );
        this.sequenceOrder(listAtom, listResult);
    }

    //排序
    public void sequenceOrder(List<ProductTemplateAtom> listAtom, List<ProductTemplateAtom> listResult) {
        for (int i = 0; i < listAtom.size(); i++) {
            ProductTemplateAtom productTemplateAtom = listAtom.get(i);
            productTemplateAtom.setAtomSerialNumber(i);
            listResult.add(productTemplateAtom);
        }
        productTemplateAtomService.updateBatchById(listResult);
    }


}
